#pragma once

#include <queue>
#include <mutex>
#include "ShmSharedPtrNode.hpp"
#include "ShmMemoryPool.hpp"


class ShmQueue
{
public:
    // 向队列中添加节点
    void push(ShmSharedPtrNode* node) {
        std::lock_guard<std::mutex> lock(_mutex);

        // 增加引用计数
        node->_count++;
        _que.push(node);
    }

    // 从队列中弹出节点，并在_count为0时释放资源
    void pop() {
        std::lock_guard<std::mutex> lock(_mutex);
        if (!_que.empty()) {
            ShmSharedPtrNode* node = _que.front();
            _que.pop();

            // 检查引用计数
            if (node->_count == 1) {
                // 释放管理内存块
                ShmMemoryPool::GetInstance()->Deallocate(node->manageBlock._shmID, node->manageBlock._shmPos);
                // 释放自己
                ShmMemoryPool::GetInstance()->Deallocate(node->myblock._shmID, node->myblock._shmPos);
            }
            // 减少引用计数
            node->_count--;
        }
    }

    // 获取队列前端的节点，并增加引用计数
    ShmSharedPtrNode* front() {
        std::lock_guard<std::mutex> lock(_mutex);

        if (!_que.empty()) {
            ShmSharedPtrNode* node = _que.front();
            node->_count++;
            return node;
        }
        return nullptr;
    }

    // 检查队列是否为空
    bool empty() const {
        std::lock_guard<std::mutex> lock(_mutex);
        return _que.empty();
    }

    // 获取队列的大小
    size_t size() const {
        std::lock_guard<std::mutex> lock(_mutex);
        return _que.size();
    }

private:
    std::queue<ShmSharedPtrNode*> _que;  // 使用指针存储节点
    mutable std::mutex _mutex;
};
